﻿using System;
using System.Globalization;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;

using PEMS.Common;

namespace PEMS.Client
{
    class Client
    {
        private static System.Timers.Timer _pingTimer = new System.Timers.Timer();

        static void Main(string[] args)
        {
            Properties.Settings.Default.Save();
            _pingTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            _pingTimer.Interval = 4000;
            _pingTimer.Start();
            _pingTimer.Enabled = false;
            Console.Title = "PEMS client";
            fomenu();            
        }

        /// <summary>
        /// időzítés, hogy ne kelljen bizonyos tétlenség után ismét bejelentkezni
        /// ha a szerver közben egyszer is nem válaszol, akkor mindenképp login kell
        /// </summary>
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            if (ClientController.instance.ping())
            {
                Console.Title = "PEMS client | " + ClientController.instance.kliensID.strings["userNev"];
            }
            else
            {
                header();
                _pingTimer.Enabled = false;
                Console.Write("\nUj bejelentkezes szukseges!");
            }
            GC.Collect();
        }

        /// <summary>
        /// metódusok visszatérő üzenetének megjelenítése
        /// stringekhez
        /// </summary>
        private static void display_message(string msg, int soremeles = 1, ConsoleColor color = ConsoleColor.Gray)
        {
            if (msg.Length == 0)
            {
                return;
            }
            for (int i = 0; i <= soremeles; i++)
            {
                Console.WriteLine("\n");
            }
            if ((msg.ToUpper().Contains("MEGTORTENT")) || (msg.ToUpper().Contains("SIKER")))
            {
                Console.ForegroundColor = ConsoleColor.Green;
            }
            if ((msg.ToUpper().Contains("NINCS")) || (msg.ToUpper().Contains("HIBA")))
            {
                Console.ForegroundColor = ConsoleColor.Red;
            }
            if ((msg.ToUpper().Contains("MEGSZAKITAS")) || (msg.ToUpper().Contains("VISSZA")))
            {
                Console.ForegroundColor = ConsoleColor.Yellow;
            }
            if (color != ConsoleColor.Gray)
            {
                Console.ForegroundColor = color;
            }            
            Console.WriteLine(msg);
            Console.ForegroundColor = ConsoleColor.Gray;
        }

        /// <summary>
        /// metódusok visszatérő üzenetének megjelenítése
        /// komm.msg -hez
        /// </summary>
        private static void display_message(List<string> msg)
        {
            if (msg.Count == 0)
            {
                return;
            }
            foreach (string s in msg)
                display_message(s, 0);
        }
        

        /// <summary>
        /// jogosultságfüggő menü kirajzolása
        /// </summary>
        private static void display_szemelyesMenu(ref int jog)
        {
            header();

            string userNev = ClientController.instance.kliensID.strings["userNev"];

            if (!ClientController.instance.kliensID.bools["belepve"])
                Console.WriteLine("1.  Bejelentkezes");
            else
            {
                Console.WriteLine("1.  Kijelentkezes");

                if (ClientController.instance.getFelhasznaloJogosultsag(userNev).Equals(UserTypeEnum.hallgato))
                {
                    jog = 100;
                    Console.WriteLine("2.  Beiratkozas felevre");
                    Console.WriteLine("3.  Kurzusjelentkezes");
                    Console.WriteLine("4.  Felvett kurzusok");
                    Console.WriteLine("5.  Vizsgajelentkezes");
                    Console.WriteLine("6.  Felvett vizsgák");
                    Console.WriteLine("7.  Vizsgaeredmények");
                    Console.WriteLine("8.  Felevek lekerdezese");
                    Console.WriteLine("9.  Adatmodositas");
                    Console.WriteLine("10. Üzenet küldése");
                    Console.WriteLine("11. Üzenetek olvasása");
                }

                if (ClientController.instance.getFelhasznaloJogosultsag(userNev).Equals(UserTypeEnum.oktato))
                {
                    jog = 200;
                    Console.WriteLine("2.  Vizsga meghirdetese");
                    Console.WriteLine("3.  Meghirdetett vizsgák");
                    Console.WriteLine("4.  Alairas beallitasa");
                    Console.WriteLine("5.  Vizsga ertekelese");
                    Console.WriteLine("6.  Adatmodositas");
                    Console.WriteLine("10. Üzenet küldése");
                    Console.WriteLine("11. Üzenetek olvasása");
                }

                if (ClientController.instance.getFelhasznaloJogosultsag(userNev).Equals(UserTypeEnum.administrator))
                {
                    jog = 300;
                    Console.WriteLine("2.  Felev hozzaadasa");
                    Console.WriteLine("3.  Felevek listaja");
                    Console.WriteLine("4.  Uj targy hozzaadasa");
                    Console.WriteLine("5.  Felhasznalo hozzaadasa");
                    Console.WriteLine("6.  Felhasznalok listaja");
                    Console.WriteLine("7.  Felhasznalo aktivalas / deaktivalas");
                    Console.WriteLine("8.  Kurzus meghirdetese");
                    Console.WriteLine("9.  Kurzuslista");
                    Console.WriteLine("10. Üzenet küldése");
                    Console.WriteLine("11. Üzenetek olvasása");
                    Console.WriteLine("12. Üzenet mindenkinek");
                }

            }
            Console.WriteLine("0.  Kilepes");            

            menualattisor();
        }

        /// <summary>
        /// jegy értékelésekor felugró oktatói almenü
        /// </summary>
        private static void display_vizsgaErtekelesMenu()
        {
            Console.WriteLine("\nValasszon egy osztalyzatot:\n");
            Console.WriteLine("1. Elegtelen");
            Console.WriteLine("2. Elegseges");
            Console.WriteLine("3. Kozepes");
            Console.WriteLine("4. Jo");
            Console.WriteLine("5. Jeles");
            Console.WriteLine("6. Nem jelent meg");
            Console.WriteLine("0. Vissza");
        }

        /// <summary>
        /// felhasználói műveletek megerősítése
        /// </summary>
        private static bool valasztasMegerositese(string szoveg, string megszakitSzoveg)
        {
            string valasz;
            do {
                display_message(szoveg + " (I / N)");
                valasz = Console.ReadLine().ToUpper();
                if ((valasz != "I") && (valasz != "N"))
                {
                    display_message("Nincs ilyen valaszlehetoseg, probalja ujra!\n");
                }
            } while ((valasz != "I") && (valasz != "N"));
            if (valasz == "N")
            {
                display_message("Felhasznaloi megszakitas. Nem tortent meg a(z) " + megszakitSzoveg + ".");
            }
            return (valasz == "I");
        }

        /// <summary>
        /// félévlista megjelenítése;
        /// ha a paraméter true, csak az aktuális félévet listázza
        /// false esetén mindegyiket
        /// </summary>
        private static void felevLista(bool aktualis)
        {
            List<string> msg = ClientController.instance.getFelevLista(aktualis);
            display_message(msg);
        }

        /// <summary>
        /// félév vizsgálat
        /// </summary>
        private static bool felevVizsgalat()
        {
            if (ClientController.instance.getAktualisFelev() == null)
            {
                display_message("Nincs felev a rendszerben.");
                return false;
            }
            return true;
        }

        /// <summary>
        /// kurzuslista megjelenítése
        /// </summary>
        private static int kurzusLista(string userName = "")
        {
            if (!felevVizsgalat())
            {
                return 0;
            }
            List<string> msg = ClientController.instance.getKurzusLista(ClientController.instance.getAktualisFelev(), userName);
            display_message(msg);
            return msg.Count;
        }

        /// <summary>
        /// hallgatók listázása
        /// </summary>
        private static void hallgatoLista(bool csakAktiv, string userNev)
        {
            List<string> msg = ClientController.instance.getHallgatoLista(csakAktiv: csakAktiv, kurzus: "", vizsgaidopontID: "", userName: userNev);
            display_message(msg);
        }

        /// <summary>
        /// egy adott kurzust felvett hallgatók listázása
        /// </summary>
        private static int hallgatoLista(string kurzusID, string userNev, string vizsgaidopontID = "", bool alairasLista = false)
        {
            bool csakAktiv = true;
            List<string> msg = ClientController.instance.getHallgatoLista(csakAktiv, kurzusID, vizsgaidopontID, userNev, alairasLista);
            display_message(msg);
            return msg.Count;
        }

        /// <summary>
        /// oktatók listázása
        /// </summary>
        private static void oktatoLista(bool csakAktiv)
        {
            List<string> msg = ClientController.instance.getOktatoLista(csakAktiv);
            display_message(msg);
        }
                
        /// <summary>
        /// alapértelmezett válasz a felhasználótól
        /// </summary>
        private static string alapertelmezettValasztas(string beolvasott, string alapertelmezett)
        {
            if (beolvasott.Length == 0)
            {
                return alapertelmezett;
            }
            return beolvasott;
        }

        /// <summary>
        /// félév kiválasztása beiratkozás céljából
        /// </summary>
        private static string felevetValaszt()
        {
            display_message("Melyik felevre kivan beiratkozni? (0 - megsem) ");
            string valasztas;
            do {
                valasztas = Console.ReadLine();
                valasztas = alapertelmezettValasztas(valasztas, "0");
                if (valasztas != "0")
                {
                    if (ClientController.instance.felevLetezik(valasztas))
                    {
                        return valasztas;
                    }
                    display_message("Nincs ilyen felev, probalja ujra: ");
                }
            } while(valasztas != "0");
            display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
            return null;
        }

        /// <summary>
        /// kurzus kiválasztása kurzusjelentkezés céljából
        /// </summary>
        private static string kurzustValaszt(string felevID)
        {
            display_message("Melyik kurzust kivanja felvenni? (0 - megsem) ");
            string kurzusID;
            do
            {
                kurzusID = Console.ReadLine();
                kurzusID = alapertelmezettValasztas(kurzusID, "0");
                if (kurzusID != "0")
                {
                    if (ClientController.instance.kurzusLetezik(felevID, kurzusID))
                    {
                        return kurzusID;
                    }
                    display_message("Nincs ilyen kurzus, probalja ujra: ");
                }
            } while (kurzusID != "0");
            display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
            return null;
        }

        public static bool kurzusraSzures(string userName, ref string kurzusID)
        {
            bool hallgatoBelepve = ClientController.instance.getFelhasznaloJogosultsag(userName).Equals(UserTypeEnum.hallgato);
            if (hallgatoBelepve)
            {
                if (getFelvettKurzusok() == 0)
                {
                    return false;
                }
            }
            display_message("Melyik kurzusra kivan keresni? (0 - megsem) ");
            do
            {
                kurzusID = Console.ReadLine();
                kurzusID = alapertelmezettValasztas(kurzusID, "0");
                if (kurzusID != "0")
                {
                    if (ClientController.instance.kurzusLetezik(ClientController.instance.getAktualisFelev(), kurzusID))
                    {
                        if (hallgatoBelepve)
                        {
                            if (meghirdetettVizsgak(true, kurzusID) == 0)
                            {
                                display_message("Egyetlen vizsga sincs meghirdetve.");
                                break;
                            }
                        }
                        return true;
                    }
                    display_message("Nincs ilyen kurzus, probalja ujra: ");
                }
            } while (kurzusID != "0");
            display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
            return false;
        }

        /// <summary>
        /// vizsgaidőpont kiválasztása vizsgajelentkezés, vagy vizsga értékelésének céljából
        /// </summary>
        private static string vizsgaIdopontvalasztas(string felevID, ref string kurzusID)
        {            
            display_message("Melyik vizsgara kivan jelentkezni? (0 - megsem) ");
            string vizsgaID;
            do
            {
                vizsgaID = Console.ReadLine();
                vizsgaID = alapertelmezettValasztas(vizsgaID, "0");
                if (vizsgaID != "0")
                {
                    if (kurzusID == "")
                    {
                        kurzusID = ClientController.instance.getKurzusbyVizsgaidopontID(ClientController.instance.getAktualisFelev(), vizsgaID);
                    }

                    if (kurzusID != "")
                    {
                        if (ClientController.instance.vizsgaLetezik(felevID, kurzusID, vizsgaID))
                        {
                            return vizsgaID;
                        }
                    }
                    display_message("Nincs ilyen vizsga meghirdetve, probalja ujra: ");
                }
            } while (vizsgaID != "0");
            display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
            return null;
        }
        
        /// <summary>
        /// felvett kurzusok listázása
        /// </summary>
        private static int getFelvettKurzusok()
        {
            if (!felevVizsgalat())
            {
                return 0;
            }
            List<string> msg = ClientController.instance.getFelvettKurzus(ClientController.instance.getAktualisFelev(), ClientController.instance.kliensID.strings["userNev"]);
            display_message(msg);
            return msg.Count;
        }

        /// <summary>
        /// meghirdetett vizsgák listázása
        /// </summary>
        private static int meghirdetettVizsgak(bool csakKurzushoz, string kurzusID)
        {
            if (!felevVizsgalat())
            {
                return 0;
            }
            List<string> msg;
            if (csakKurzushoz)
            {
                msg = ClientController.instance.getVizsgaIdopontok(ClientController.instance.getAktualisFelev(), kurzusID);
            }
            else
            {
                msg = ClientController.instance.getVizsgaIdopontok(ClientController.instance.getAktualisFelev());
            }
            display_message(msg);
            return msg.Count;
        }
         
        /// <summary>
        /// felhasználó hozzáadása
        /// </summary>
        private static void felhasznaloHozzaadasa()
        {
            display_message("Kerem adja meg az uj felhasznalo azonositojat (0 - megsem): ");
            string userName;
            do
            {
                userName = Console.ReadLine();
                userName = alapertelmezettValasztas(userName, "0");
                if (userName == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    break;
                }
                if (ClientController.instance.felhasznaloLetezik(userName))
                {
                    display_message("Hiba! A felhasznalo mar letezik, nem viheto fel. Adjon meg uj felhasznaloi azonositot: ");
                    userName = "0";
                }
            } while (userName == "0");
            if (userName == "0")
            {
                return;
            }

            display_message("Kerem adja meg az uj felhasznalo teljes nevet: ");
            string fullName = Console.ReadLine();
            display_message("Kerem adja meg az uj felhasznalo jelszavat: ");
            string password = Console.ReadLine();

            display_message("Az uj felhasznalo jogosultsagi szintje [H]: O - Oktato / H - Hallgato");
            string jogosultsag;
            do
            {
                jogosultsag = Console.ReadLine().ToUpper();
                jogosultsag = alapertelmezettValasztas(jogosultsag, "H");
                if ((jogosultsag != "O") && (jogosultsag != "H"))
                {
                    display_message("Nincs ilyen opcio, probalja ujra: ");
                    jogosultsag = "0";
                }
            } while (jogosultsag == "0");

            UserTypeEnum felhasznaloJog = UserTypeEnum.nincs_ilyen_felhasznalo;
            switch (jogosultsag)
            {
                case "H":
                    felhasznaloJog = UserTypeEnum.hallgato;
                    break;
                case "O":
                    felhasznaloJog = UserTypeEnum.oktato;
                    break;
                default:
                    break;
            }
            if (valasztasMegerositese("Biztosan rogziti az uj felhasznalot?", "felhasznalo hozzaadasa"))
            {
                ClientController.instance.felhasznaloHozzaadasa(userName, fullName, password, felhasznaloJog);
                display_message("Uj felhasznalo hozzaadasa megtortent. Folytatashoz nyomjon entert!");
            }
        }

        /// <summary>
        /// tárgyak listázása
        /// </summary>
        private static int targyLista()
        {
            List<string> msg = ClientController.instance.getTargyLista();
            display_message(msg);
            return msg.Count;
        }

        /// <summary>
        /// új tárgy hozzáadása
        /// </summary>
        private static void targyHozzaadasa()
        {
            targyLista();
            string targyID;
            string megnevezes = "";
            display_message("Kerem adja meg az uj targy azonositojat (0 - megsem): ");
            do
            {
                targyID = Console.ReadLine();
                targyID = alapertelmezettValasztas(targyID, "0");
                if (targyID == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    return;
                }
                if (ClientController.instance.targyLetezik(targyID))
                {
                    display_message("Hiba! Ilyen targy mar letezik. Adjon meg uj targyat: ");
                    targyID = "0";
                }

            } while (targyID == "0");
            display_message("Kerem adja meg az uj targy leirasat: ");
            megnevezes = Console.ReadLine();
            if (valasztasMegerositese("Biztosan rogziti az uj targyat a rendszerbe?", "uj targy rogzitese"))
            {
                if (ClientController.instance.targyHozzaadasa(targyID, megnevezes))
                {
                    display_message("Uj targy hozzaadasa az intezmenyi listahoz megtortent.");
                }
                else
                {
                    display_message("Hiba! Uj targy felvitele nem sikerult.");
                }
            }
        }

        /// <summary>
        /// kurzus meghirdetese
        /// </summary>
        private static void kurzusMeghirdetese()
        {            
            string felevID = ClientController.instance.getAktualisFelev();
            if (felevID == null)
            {
                display_message("Hiba! Nincs aktiv felev.");
                return;
            }
            string targyID;
            do
            {
                targyLista();
                display_message("Melyik targyat kivanja kurzuskent inditani? (0 - megsem) ");
                targyID = Console.ReadLine();
                targyID = alapertelmezettValasztas(targyID, "0");
                if (targyID == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    return;
                }
                if (!ClientController.instance.targyLetezik(targyID))
                {
                    display_message("Hiba! Ilyen targy nem letezik, nem indithato kurzuskent. Adjon meg uj targyat: ");
                    targyID = "0";
                }
            } while (targyID == "0");

            string kurzusID;
            string megnevezes = "";
            display_message("Kerem adja meg az inditani kivant kurzus azonositojat: ");
            do
            {                
                kurzusID = Console.ReadLine();
                if (ClientController.instance.kurzusLetezik(felevID, kurzusID))
                {
                    display_message("Hiba! A kurzus mar letezik. Adjon meg uj kurzus azonositot: ");
                    kurzusID = "0";
                }
                else
                {
                    display_message("Kerem adja meg a kurzus rovid leirasat: ");
                    megnevezes = Console.ReadLine();
                }                
            } while (kurzusID == "0");
                        
            oktatoLista(csakAktiv: false);
            display_message("Melyik oktatot kivanja hozzarendelni a kurzushoz? ");
            string oktatoID;
            do
            {
                oktatoID = Console.ReadLine();
                if (!ClientController.instance.felhasznaloLetezik(oktatoID))
                {
                    display_message("Hiba! Ilyen oktato nem letezik. Adjon meg uj oktatot: ");
                    oktatoID = "0";
                }
            } while (oktatoID == "0");
            if (valasztasMegerositese("Biztosan meghirdeti a kurzust?", "kurzus meghirdetese"))
            {
                if (ClientController.instance.kurzusMeghirdetese(felevID, kurzusID, megnevezes, targyID, oktatoID))
                {
                    display_message("Kurzus meghirdetese megtortent.");
                }
                else
                {
                    display_message("Hiba! A kurzus meghirdetese nem sikerult.");
                }
            }
        }
            
        /// <summary>
        /// vizsga meghirdetese
        /// </summary>
        private static void vizsgaMeghirdetese()
        {
            string felevID = ClientController.instance.getAktualisFelev();
            if (felevID == null)
            {
                display_message("Hiba! Nincs aktiv felev.");
                return;
            }

            string kurzusID;
            kurzusLista(ClientController.instance.kliensID.strings["userNev"]);
            display_message("Kerem valasszon kurzust (0 - megsem): ");
            do
            {
                kurzusID = Console.ReadLine();
                kurzusID = alapertelmezettValasztas(kurzusID, "0");
                if (kurzusID == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    return;
                }
                if (!ClientController.instance.kurzusLetezik(felevID, kurzusID))
                {
                    display_message("Hiba! Nem letezo kurzust valasztott, probalja ujra: ");
                    kurzusID = "0";
                }
            } while (kurzusID == "0");

            string idopont;
            datumEllenorzes(out idopont, szoveg: "Kerem adja meg a vizsga idopontjat (formatum: 2013/05/25 09:00): ", alapertelmezettDatum: "2013/05/25 09:00", formatum: "yyyy/MM/dd hh:mm");

            string maxLetszamString;
            int maxLetszam;
            display_message("Kerem adja meg a maximalis letszamot (1 - 100) (0 - megsem): ");
            do
            {
                maxLetszamString = Console.ReadLine();
                maxLetszamString = alapertelmezettValasztas(maxLetszamString, "0");
                if (maxLetszamString == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    return;
                }
                if (int.TryParse(maxLetszamString, out maxLetszam))
                {                    
                    if ((maxLetszam < 1) || (maxLetszam > 100))
                    {
                        display_message("Hibasan adta meg a ferohelyek szamat, probalja ujra (a termek maximalisan 100 fo befogadasara kepesek): ");
                        maxLetszamString = "0";
                    }
                }
                else
                {
                    display_message("Hiba! Nem szamot adott meg, probalja ujra: ");
                    maxLetszamString = "0";
                }
                Console.WriteLine(maxLetszam);
            } while (maxLetszamString == "0");

            if (valasztasMegerositese("Biztosan meghirdeti a vizsgat?", "vizsga meghirdetese"))
            {
                if (ClientController.instance.vizsgaMeghirdetese(felevID, kurzusID, DateTime.Parse(idopont), maxLetszam))
                {
                    display_message("A vizsga meghirdetese sikeres.");
                }
                else
                {
                    display_message("Hiba! A vizsga meghirdetese nem sikerult.");
                }
            }
        }


        /// <summary>
        /// aktiv-e a hallgató státusza az adott félévben
        /// </summary>
        private static bool felevStatuszEllenorzes(string felevID, string userNev)
        {
            if (!ClientController.instance.getFelevStatuszAktiv(felevID, userNev))
            {
                display_message("Hiba! A hallgato feleves statusza passziv.");
                return false;
            }
            return true;
        }


        /// <summary>
        /// dátum formátum ellenőrzése
        /// </summary>
        private static void datumEllenorzes(out string datum, string szoveg, string alapertelmezettDatum, string formatum = "yyyy/MM/dd")
        {
            bool datumOk;
//            string formatum = "yyyy/MM/dd";
            DateTime dateTime;
            do
            {
                datumOk = false;
                display_message(szoveg);
                datum = Console.ReadLine();
                datum = alapertelmezettValasztas(datum, alapertelmezettDatum);
                if (DateTime.TryParseExact(datum, formatum, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime))
                {
                    datumOk = true;
                }
                else
                {
                    display_message("Hibas datum formatum, probalja ujra (pl. " + alapertelmezettDatum + "): ");
                }
            } while (!datumOk);
        }


        /// <summary>
        /// felhasználó aktiválása/deaktiválása
        /// </summary>
        private static void felhasznaloDeaktivalasa(string userNev)
        {
            bool csakAktiv = false;
            string userIDToActivate;
            hallgatoLista(csakAktiv, userNev);
            oktatoLista(csakAktiv);
            display_message("Kerem valasszon felhasznalot az aktivalashoz / deaktivalashoz (0 - megsem): ");
            do
            {
                userIDToActivate = Console.ReadLine();
                userIDToActivate = alapertelmezettValasztas(userIDToActivate, "0");
                if (userIDToActivate == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    return;
                }
                if (ClientController.instance.felhasznaloLetezik(userIDToActivate))
                {
                    display_message("Kerem adjon megjegyzest a muvelethez (pl. tanulo felbehagyta a tanulmanyait): ");
                    string megjegyzes = Console.ReadLine();
                    megjegyzes = alapertelmezettValasztas(megjegyzes, "Nem toltotte ki a megjegyzest! - userID: " + userNev);
                    if (valasztasMegerositese("Biztosan modositja a felhasznalo statuszat?", "aktivalas / deaktivalas"))
                    {
                        display_message("Sikeres muvelet vegrehajtas. A felhasznalo uj statusza: " + ClientController.instance.felhasznaloDeaktivalasa(userIDToActivate, megjegyzes));
                        return;
                    }                    
                }
                else
                {
                    display_message("Hiba! Nem letezik ilyen felhasznalo, probalja ujra (0 - megsem): ");
                    userIDToActivate = "0";
                }
            } while (userIDToActivate == "0");
        }
        

        /// <summary>
        /// saját adatok módosítása
        /// </summary>
        private static void adatmodositas(string userNev)
        {
            string valasz;
            display_message("Nevet vagy jelszot szeretne valtoztatni? (N / J) (0 - megsem): ");
            do
            {
                valasz = Console.ReadLine().ToUpper();
                valasz = alapertelmezettValasztas(valasz, "0");                
                if (valasz == "0")
                {
                    display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                    return;
                }
                if ((valasz != "N") && (valasz != "J"))
                {
                    display_message("Nincs ilyen opcio, probalja ujra: ");
                }
            } while ((valasz != "N") && (valasz != "J"));
            string str;
            switch (valasz)
            {
                case "N" :
                    display_message("Kerem adja meg az uj nevet: ");
                    str = Console.ReadLine();
                    if (valasztasMegerositese("Biztosan modositja a nevet?", "nev modositasa"))
                    {
                        display_message(ClientController.instance.felhasznaloiAdatokModositasa(userName: userNev, fullName: str));                        
                    }
                    break;

                case "J" :
                    display_message("Kerem adja meg az uj jelszavat: ");
                    str = Console.ReadLine();
                    if (valasztasMegerositese("Biztosan modositja a jelszot?", "jelszo modositasa"))
                    {
                        display_message(ClientController.instance.felhasznaloiAdatokModositasa(userName: userNev, password: str));
                    }
                    break;

                default:
                    break;
            }

        }

        private static void beiratkozasFelevre()
        {
            string userNev = ClientController.instance.kliensID.strings["userNev"];
            if (!felevVizsgalat())
            {
                return;
            }

            bool aktualis = false;
            bool megerosites = false;
            do
            {
                felevLista(aktualis);
                string felevID = felevetValaszt();
                if (felevID == null)
                {
                    break;
                }
                List<string> lekerdez = ClientController.instance.getFelevFelveve(felevID, userNev);
                display_message(lekerdez);
                if (lekerdez.Count == 0)
                {
                    bool felevStatuszAktiv = false;
                    string statusz;
                    display_message("Kerem nyilatkozzon a feleves statuszrol (aktiv / passziv) [aktiv]: ");
                    do
                    {
                        statusz = Console.ReadLine().ToUpper();
                        statusz = alapertelmezettValasztas(statusz, "A");
                        if ((statusz != "A") && (statusz != "P"))
                        {
                            display_message("Nincs ilyen opcio, probalja ujra: ");
                        }
                        if (statusz == "A")
                        {
                            felevStatuszAktiv = true;
                        }
                    } while ((statusz != "A") && (statusz != "P"));
                    megerosites = valasztasMegerositese("Biztosan beiratkozik?", "beiratkozas");
                    if (megerosites)
                    {
                        List<string> msg = ClientController.instance.beiratkozasFelevre(felevID, userNev, felevStatuszAktiv);
                        display_message(msg);
                    }
                }
            } while (!megerosites);
        }

        private static void vizsgajelentkezes()
        {
            string userNev = ClientController.instance.kliensID.strings["userNev"];
            string felevID = ClientController.instance.getAktualisFelev();
            if (felevID.ToUpper().Contains("HIBA"))
            {
                display_message(felevID);
                return;
            }
            if (!felevStatuszEllenorzes(felevID, userNev))
            {
                return;
            }
            display_message("Kivan egy adott kurzusra szurni? (I / N) [N]");
            string szures;
            string kurzusID = "";
            do
            {
                szures = Console.ReadLine().ToUpper();
                szures = alapertelmezettValasztas(szures, "N");
                if ((szures != "I") && (szures != "N"))
                {
                    display_message("Nincs ilyen opcio, probalja ujra: ");
                }
            } while ((szures != "I") && (szures != "N"));

            if (szures == "I")
            {
                if (!kurzusraSzures(userNev, ref kurzusID))
                {
                    return;
                }
            }
            else
            {
                if (meghirdetettVizsgak(false, "") == 0)
                {
                    display_message("Egyetlen vizsga sincs meghirdetve.");
                    return;
                }
            }

            bool megerosites = false;
            do
            {
                string vizsgaidopontID = vizsgaIdopontvalasztas(felevID, ref kurzusID);
                if (vizsgaidopontID == null)
                {
                    break;
                }
                megerosites = valasztasMegerositese("Biztosan jelentkezik a vizsgara?", "jelentkezes");
                if (megerosites)
                {
                    List<string> msg = ClientController.instance.vizsgaJelentkezes(userNev, felevID, kurzusID, vizsgaidopontID);
                    display_message(msg);
                }
            } while (!megerosites);
        }

        private static void uzenetKuldes()
        {
            Console.Write("Felhasználók listája:\n\n");
            List<List<string>> tabla = ClientController.instance.getUsers();
            foreach (List<string> row in tabla)
                Console.Write("{0} : {1}\n", row[0], row[1]);
            Console.Write("\nCímzett: [felhasználó azonosító]\n\n");
            string cim = Console.ReadLine();
            bool kuldheto = false;
            foreach (List<string> row in tabla)
                if (row[0] == cim)
                    kuldheto = true;
            if (!kuldheto)
            {
                Console.Write("Nem jó címzett! Próbálja újra. (kis és nagybetű számít)\n");
                return;
            }
            Console.Write("Üzenet beírása:\n");
            string uzenet = Console.ReadLine();
            bool megerosites = valasztasMegerositese("Elküldi?", "Üzenet kézbesítése");
            if (megerosites)
            {
                List<string> msg = ClientController.instance.uzenetKuldes(cim, uzenet);
                display_message(msg);
            }
        }

        private static void uzenetKuldesMindenkinek()
        {
            Console.Write("Üzenet beírása:\n");
            string uzenet = Console.ReadLine();
            bool megerosites = valasztasMegerositese("Elküldi?", "Üzenet kézbesítése");
            if (megerosites)
            {
                List<string> msg = ClientController.instance.uzenetMindenkinek(uzenet);
                display_message(msg);
            }
        }

        private static void uzenetLekeres()
        {
            Console.Write("Üzenetek listája:\n");
            List<List<string>> tabla = ClientController.instance.uzenetLekeres();
            foreach (List<string> row in tabla)
                Console.Write("{0} : {1} : {2} : {3}\n", row[0], row[1], row[2], row[3]);
        }

        /// <summary>
        /// a főmenü
        /// </summary>
        public static void fomenu(){
            int selector = -1;
            int jog = 0;
            bool exit = false;
            bool good = false;            
            do
            {
                string userNev = ClientController.instance.kliensID.strings["userNev"];
                display_szemelyesMenu(ref jog);                
                good=int.TryParse(Console.ReadLine(), out selector);
                if (good)
                {
                    if (selector > 1)
                        selector += jog;
                    switch (selector)
                    {
                        case 1: // Logon - Logoff - Mindenki
                            if (!ClientController.instance.kliensID.bools["belepve"])
                                logon();
                            else
                                logoff();                            
                            break;
                        case 110: // Üzenetküldés - Hallgato
                            {
                                uzenetKuldes();
                                break;
                            }

                        case 111: // Üzenetlekérés - Hallgato
                            {
                                uzenetLekeres();
                                break;
                            }
                        case 102: // Beiratkozás félévre - Hallgato
                            {
                                beiratkozasFelevre();
                                break;
                            }

                        case 103: // Kurzusjelentkezés - Hallgato
                            {
                                string felevID = ClientController.instance.getAktualisFelev();
                                if (felevID.ToUpper().Contains("HIBA"))
                                {
                                    display_message(felevID);
                                    break;
                                }
                                if (!felevStatuszEllenorzes(felevID, userNev))
                                {
                                    break;
                                }
                                bool megerosites = false;
                                do
                                {
                                    if (kurzusLista() == 0)
                                    {
                                        break;
                                    }                                    
                                    string kurzusID = kurzustValaszt(felevID);
                                    if (kurzusID == null)
                                    {
                                        break;
                                    }
                                    List<string> lekerdez = ClientController.instance.getKurzusFelveve(felevID, kurzusID, userNev);
                                    display_message(lekerdez);
                                    if (lekerdez.Count == 0)
                                    {
                                        megerosites = valasztasMegerositese("Biztosan felveszi a kurzust?", "kurzusfelvetel");
                                        if (megerosites)
                                        {
                                            List<string> msg = ClientController.instance.kurzusJelentkezes(userNev, felevID, kurzusID);
                                            display_message(msg);
                                        }
                                    }                                    
                                } while (!megerosites);
                                break;
                            }

                        case 104: // Felvett kurzusok - Hallgato
                            display_message("Felvett kurzusok:\n\n");
                            if (getFelvettKurzusok() == 0)
                            {
                                display_message("Meg nem vett fel kurzust a kerdeses felevben.");
                            }
                            break;

                        case 105:  // Vizsgajelentkezés - Hallgato
                            {
                                vizsgajelentkezes();
                                break;
                            }
                                                   
                        case 106: // Felvett vizsgák - Hallgato
                            {
                                if (!felevVizsgalat())
                                {
                                    break;
                                }
                                List<string> msg = ClientController.instance.getFelvettVizsga(ClientController.instance.getAktualisFelev(), userNev);
                                if (msg.Count == 1)
                                {
                                    display_message("Meg nem vett fel vizsgat a kerdeses felevben.");
                                }
                                else
                                {
                                    display_message(msg);
                                }
                                break;
                            }

                        case 107: // Vizsgaeredmények - Hallgato
                            {
                                if (!felevVizsgalat())
                                {
                                    break;
                                }
                                List<string> msg = ClientController.instance.getVizsgaEredmenyek(ClientController.instance.getAktualisFelev(), userNev);
                                if (msg.Count == 1)
                                {
                                    display_message("Meg nem vett fel vizsgat a kerdeses felevben.");
                                }
                                else
                                {
                                    display_message(msg);
                                }
                                break;
                            }

                        case 108: // Félévek - Hallgato
                            {
                                List<string> msg = ClientController.instance.getFelevInfo(userNev);
                                if (msg.Count == 1)
                                {
                                    display_message("Meg nem iratkozott be egy felevre sem.");
                                }
                                else
                                {
                                    display_message(msg);
                                }
                                break;
                            }

                        case 109:    // Adatmódosítás - Hallgato

                        case 210: // Üzenetküldés - Oktato
                            {
                                uzenetKuldes();
                                break;
                            }

                        case 211: // Üzenetlekérés - Oktato
                            {
                                uzenetLekeres();
                                break;
                            }
                        case 206:    // Adatmódosítás - Oktato
                            adatmodositas(userNev);
                            break;

                        case 202: // Vizsga meghirdetése - Oktato
                            {
                                vizsgaMeghirdetese();
                                break;
                            }

                        case 203: // Meghirdetett vizsgák - Oktato
                            if (meghirdetettVizsgak(false, "") == 0)
                            {
                                display_message("Egyetlen vizsga sincs meghirdetve.");
                            }
                            break;

                        case 204: // Aláírás beállítása - Oktato
                            {
                                if (kurzusLista(userNev) == 0)
                                {
                                    break;
                                }
                                string felevID = ClientController.instance.getAktualisFelev();
                                string kurzusID = "";
                                if (!kurzusraSzures(userNev, ref kurzusID))
                                {
                                    break;
                                }
                                // hallgatók listázása és hallgató kiválasztása
                                bool megerosites = false;
                                do
                                {
                                    if (hallgatoLista(kurzusID: kurzusID, userNev: userNev, vizsgaidopontID: "", alairasLista: true) == 1)                                        
                                    {
                                        display_message("Ezt a kurzust nem vette fel egyetlen hallgato sem. Valasszon masik kurzust!");
                                        break;
                                    }
                                    display_message("Melyik hallgatonak kivan alairast adni? (0 - megsem)");
                                    string hallgatoID = Console.ReadLine();
                                    hallgatoID = alapertelmezettValasztas(hallgatoID, "0");
                                    if (hallgatoID == "0")
                                    {
                                        display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                                        break;
                                    }
                                    if (!felevStatuszEllenorzes(felevID, hallgatoID))
                                    {
                                        break;
                                    }
                                    if (ClientController.instance.felhasznaloLetezik(hallgatoID))
                                    {
                                        List<string> lekerdez = ClientController.instance.getAlairasBeallitva(felevID, kurzusID, hallgatoID);
                                        display_message(lekerdez);
                                        if (lekerdez.Count == 0)
                                        {
                                            if (valasztasMegerositese("Biztosan megadja az alairast?", "alairas beallitas"))
                                            {
                                                List<string> msg = ClientController.instance.alairasBeallitas(felevID, kurzusID, hallgatoID, AlairasEnum.alairva);
                                                display_message(msg);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        display_message("Nincs ilyen hallgato, probalja ujra: ");
                                    }
                                } while (!megerosites);
                                break;
                            }

                        case 205: // Vizsgajegy beírása - Oktato
                            {
                                //vizsgáljuk, írhatunk-e jegyet, ehhez megkérdezzük a kontrollert
                                if (kurzusLista(userNev) == 0)
                                {
                                    break;
                                }
                                string felevID = ClientController.instance.getAktualisFelev();
                                string kurzusID = "";
                                if (!kurzusraSzures(userNev, ref kurzusID))
                                {
                                    break;
                                }                                
                                
                                bool megerosites = false;
                                do
                                {
                                    string vizsgaidopontID = "";
                                    if (hallgatoLista(kurzusID, userNev, vizsgaidopontID) == 1)
                                    {
                                        display_message("Ezt a vizsgat nem vette fel egyetlen hallgato sem. Valasszon masik vizsgat!");
                                        break;
                                    }
                                    display_message("Melyik hallgatonak kivanja ertekelni a vizsgajat? (0 - megsem)");
                                    string hallgatoID = Console.ReadLine();
                                    hallgatoID = alapertelmezettValasztas(hallgatoID, "0");
                                    if (hallgatoID == "0")
                                    {
                                        display_message("Felhasznaloi megszakitas, vissza a fomenube - folytatashoz nyomjon entert!");
                                        break;
                                    }
                                    if (!felevStatuszEllenorzes(felevID, hallgatoID))
                                    {
                                        break;
                                    }
                                    if (ClientController.instance.felhasznaloLetezik(hallgatoID))
                                    {                                        
                                        vizsgaidopontID = ClientController.instance.getFelvettVizsga(felevID, kurzusID, hallgatoID);
                                        List<string> lekerdez = ClientController.instance.vizsgajegyEllenorzes(felevID, kurzusID, vizsgaidopontID, hallgatoID);
                                        if (lekerdez.Count() == 0)
                                        {
                                            display_vizsgaErtekelesMenu();
                                            int jegy = 0;
                                            ErdemjegyEnum erdemjegy = ErdemjegyEnum.meg_nem_vizsgazott;
                                            if (int.TryParse(Console.ReadLine(), out jegy))
                                            {
                                                switch (jegy)
                                                {
                                                    case 1:
                                                        erdemjegy = ErdemjegyEnum.elegtelen;
                                                        break;
                                                    case 2:
                                                        erdemjegy = ErdemjegyEnum.elegseges;
                                                        break;
                                                    case 3:
                                                        erdemjegy = ErdemjegyEnum.kozepes;
                                                        break;
                                                    case 4:
                                                        erdemjegy = ErdemjegyEnum.jo;
                                                        break;
                                                    case 5:
                                                        erdemjegy = ErdemjegyEnum.jeles;
                                                        break;
                                                    case 6:
                                                        erdemjegy = ErdemjegyEnum.nem_jelent_meg;
                                                        break;
                                                    case 0:
                                                        display_message("Vissza a fomenube - folytatashoz nyomjon entert");
                                                        break;
                                                    default:
                                                        display_message("Nincs ilyen menupont!");
                                                        break;
                                                }
                                            }
                                            else
                                            {
                                                display_message("Nincs ilyen menupont!");
                                            }
                                            if ((jegy > 0) && (jegy < 7))
                                            {
                                                megerosites = valasztasMegerositese("Biztosan beirja az osztalyzatot? (" + erdemjegy + ")", "az ertekeles");
                                                if (megerosites)
                                                {
                                                    List<string> msg = ClientController.instance.VizsgaJegyBeiras(felevID, kurzusID, vizsgaidopontID, hallgatoID, erdemjegy);
                                                    display_message(msg);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            display_message(lekerdez);
                                        }
                                    }
                                    else
                                    {
                                        display_message("Nincs ilyen hallgato, probalja ujra: ");
                                    }
                                } while (!megerosites);
                                break;
                            }

                        case 310: // Üzenetküldés - Admin
                            {
                                uzenetKuldes();
                                break;
                            }

                        case 311: // Üzenetlekérés - Admin
                            {
                                uzenetLekeres();
                                break;
                            }
                        case 312: // Üzenet mindenkinek - Admin
                            {
                                uzenetKuldesMindenkinek();
                                break;
                            }

                        case 302: // Félév hozzáadása - Admin
                            {
                                // félév ellenőrzése, hogy ne akarjon ugyanolyat felvinni az admin
                                felevLista(false);
                                string felevID;
                                do
                                {
                                    display_message("Kerem adja meg az uj felev azonositojat (pl.: 12/13): ");
                                    felevID = Console.ReadLine();
                                    if (ClientController.instance.felevLetezik(felevID))
                                    {
                                        display_message("Hiba! A felev mar letezik, nem viheto fel. Adjon meg uj felevet: ");
                                        felevID = "0";
                                    }
                                } while (felevID == "0");
                                display_message("Kerem adja meg az uj felev leirasat (pl.: 2012-es tanev tavaszi szemeszter): ");                                
                                string felevLeiras = Console.ReadLine();                                
                                felevLeiras = alapertelmezettValasztas(felevLeiras, "2012-es tanev tavaszi szemeszter");
                                string kezdoDatum;
                                datumEllenorzes(out kezdoDatum, szoveg: "Kerem adja meg az uj felev kezdo datumat (formatum: 2013/02/01): ", alapertelmezettDatum: "2013/02/01");

                                string vegDatum;
                                datumEllenorzes(out vegDatum, szoveg: "Kerem adja meg az uj felev befejezo datumat (formatum: 2013/06/25): ", alapertelmezettDatum: "2013/06/25");

                                if (valasztasMegerositese("Biztosan rogziti az uj felevet?", "felev hozzaadasa"))
                                {
                                    if (ClientController.instance.felevHozzaadasa(felevID, felevLeiras, DateTime.Parse(kezdoDatum), DateTime.Parse(vegDatum)))
                                    {
                                        display_message("Uj felev sikeresen hozzaadva.");
                                    }
                                    else
                                    {
                                        display_message("Hiba! A felev hozzaadasa nem sikerult.");
                                    }   
                                }                                
                            }
                            break;

                        case 303: // Félévek listája - Admin
                            felevLista(false);  // TESZT
                            break;

                        case 304: // Tárgy hozzáadása - Admin
                            targyHozzaadasa();
                            break;

                        case 305: // Felhasználó hozzáadása - Admin
                            felhasznaloHozzaadasa();    
                            break;

                        case 306: // Felhasználók listája - Admin
                            bool csakAktiv = false;
                            hallgatoLista(csakAktiv, userNev);
                            oktatoLista(csakAktiv);
                            break;

                        case 307: // Felhasználó aktiválás/deaktiválás - Admin
                            felhasznaloDeaktivalasa(userNev);
                            break;

                        case 308: // Kurzus meghirdetése - Admin
                            kurzusMeghirdetese();
                            break;

                        case 309: // Kurzuslista - Admin
                            kurzusLista();
                            break;                            

                        case 0:
                            exit = true;
                            break;

                        default:
                            break;
                    }
                    if ((!exit) && (selector != 1))
                    {
                        Console.ReadLine();
                    }
                }
                else
                {
                    display_message("Nincs ilyen menupont!");
                }


            } while (!exit);
            Console.WriteLine("exit");
        }

        /// <summary>
        /// kijelentkezés
        /// </summary>
        static void logoff()
        {
            _pingTimer.Enabled = false;
            ClientController.instance.logoff();
        }

        /// <summary>
        /// bejelentkezés
        /// </summary>
        static void logon()
        {
            header();
            Console.WriteLine("logon to server: ");
            Console.Write("\nConnect to server... ");

            if (ClientController.instance.open())
            {
                Console.WriteLine("ok");
                Console.ForegroundColor = ConsoleColor.Green;
                Console.Write("\nusername: ");
                Console.ForegroundColor = ConsoleColor.Gray;
                string u = Console.In.ReadLine();
                Console.Write("password: ");
                string p = getPassword();
                Console.Write("\nlogon... ");

                if (ClientController.instance.logon(u, p))
                {
                    _pingTimer.Enabled = true;
                }
                else
                {
                    display_message(ClientController.instance.kliensID.msg);
                    Console.ReadLine();
                }
            }
            else
            {
                Console.WriteLine("\nKapcsolodasi hiba! Enter a folytatashoz...");
                Console.ReadLine();
            }
        }

        /// <summary>
        /// menü alá elválasztás
        /// </summary>
        public static void menualattisor()
        {
            int consoleWidth = Console.WindowWidth;
            for (int i = 0; i < consoleWidth; i++)
            {
                Console.Write("-");
            }
        }

        /// <summary>
        /// konzok ablak első két sora
        /// </summary>
        public static void header()
        {
            int consoleWidth = Console.WindowWidth;
            Console.Clear();
            Console.SetCursorPosition(0, 0);
            //Console.Write("PEMS - Kliens");

            if (ClientController.instance.kliensID.bools["belepve"])
            {
                Console.SetCursorPosition(0, 0);
                Console.Write("id: {0}", ClientController.instance.kliensID.strings["id"]);
                Console.SetCursorPosition(64, 0);
            
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write("user: {0}", ClientController.instance.kliensID.strings["userNev"]);
                Console.ForegroundColor = ConsoleColor.Gray;
            }
            Console.WriteLine("");

            for (int i = 0; i < consoleWidth; i++)
            {
                Console.Write("-");
            }
        }

        /// <summary>
        /// jelszó bekérés, úgy hogy ne látszódjanak a beírt karakterek
        /// </summary>
        /// <returns>a jelszó</returns>
        public static string getPassword()
        {
            string password = "";
            ConsoleKeyInfo info = Console.ReadKey(true);
            while (info.Key != ConsoleKey.Enter)
            {
                if (info.Key != ConsoleKey.Backspace)
                {
                    password += info.KeyChar;
                    info = Console.ReadKey(true);
                }
                else if (info.Key == ConsoleKey.Backspace)
                {
                    if (!string.IsNullOrEmpty(password))
                    {
                        password = password.Substring
                        (0, password.Length - 1);
                    }
                    info = Console.ReadKey(true);
                }
            }
            for (int i = 0; i < password.Length; i++)
                Console.Write("*");
            return password;
        }
        
    }
}
